home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
c
/
datelib.exe
/
CALCDATE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-27
|
10KB
|
311 lines
static char calcdate_prog[] = "@(#)char *calcdate(char *dat,long diff,char *ergdat) - Datum +/- Zahl";
static char calcdate_ver[] = "@(#)v1.10/kr ; 20.05.91";
/* calcdate Rechnen mit Datum
**
** Autor Klaus Rath
**
** Deklaration char *calcdate(char *datum, long abstand, char *erg);
**
** Übergabe Die Funktion erwartet einen String in einem der folgenden
** Formate :
** tt.mm.[[jj]jj] -- Deutsches Format
** mm/tt[/[jj]jj] -- Amerikanisches Format
** [jj]jjmmtt -- Datenbankformat DDB/4
** sowie einen long-Wert, dessen Vorzeichen die gewünschte
** Operation festlegt.
** Rückgabe Zeiger auf ein char-Array erg, daß ausreichend dimensioniert
** sein muß - calcdate gibt immer im langen Format zurück.
** Für deutsches und amerikanisches Format werden also 11,
** fürs DDB/4-Format 9 Zeichen benötigt!
**
** Anmerkungen Die Funktion berücksichtigt vollständig Schaltjahre - durch
** Aufruf der Funktion 'int schalt_jahr(int jahr)', die dem-
** entsprechend mit eingebunden werden muß.
** Sollte kein Jahrhundert im Übergabestring angegeben worden
** sein, ermittelt die Funktion das Default-Jahrhundert aus
** der Systemzeit !
** Der Bereich, in dem calcdate arbeiten kann, liegt
** zwischen dem 01.01.0000 und dem 31.12.9999 !!!
** Änderungen 1.00 ; 13.04.91
** Erste vollwertige Version
** 1.10 ; 20.05.91
** Anpassung an die Formate tt.mm. und mm/tt, die beide
** eine Vorbelegung auch des aktuellen Jahres benötigen.
*/
#include <stdio.h>
#include <string.h>
#include <time.h>
#ifdef __TURBOC__
#define ANSI
#define MSDOS
#include <stdlib.h>
#include <sys\types.h>
#else
#include <sys/types.h>
#endif
#include "datum.h"
#ifdef ANSI
char *calcdate(char *dstring, long abstand, char *erg)
#else
char *calcdate(dstring,abstand,erg)
char *dstring;
long abstand;
char *erg;
#endif
{
char tag_s[3],monat_s[3],jahr_s[3],jh_s[3];
int tag_z, monat_z, jahr_z, jh_z, jahreszahl;
int format;
char systemzeit_s[26];
time_t systemzeit;
int schaltj_jn;
int zaehler;
int day_of_year = 0;
int rest_of_year = 0;
#ifdef __TURBOC__
int mlaen[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
#else
int mlaen[13];
mlaen[0] = 0;
mlaen[1] = 31;
mlaen[2] = 28;
mlaen[3] = 31;
mlaen[4] = 30;
mlaen[5] = 31;
mlaen[6] = 30;
mlaen[7] = 31;
mlaen[8] = 31;
mlaen[9] = 30;
mlaen[10] = 31;
mlaen[11] = 30;
mlaen[12] = 31;
#endif
/* Überprüfung auf Gültigkeit bzw. Format :
*/
format = checkdate(dstring);
if ( !format ) {
strcpy(erg,(char *)FALSE);
return(erg);
}
/* Jahrhundert und Jahr aus der Systemzeit ermitteln und vorbelegen :
*/
time(&systemzeit);
strcpy(systemzeit_s,ctime(&systemzeit));
jh_s[0] = systemzeit_s[20];
jh_s[1] = systemzeit_s[21];
jh_s[2] = '\0';
jahr_s[0] = systemzeit_s[22];
jahr_s[1] = systemzeit_s[23];
jahr_s[2] = '\0';
/* Format überprüfen und umkopieren :
*/
if ( format == 1 || format == 2 || format == 7 ) { /* deutsches Format */
tag_s[0] = dstring[0];
tag_s[1] = dstring[1];
tag_s[2] = '\0';
monat_s[0] = dstring[3];
monat_s[1] = dstring[4];
monat_s[2] = '\0';
if ( format == 2 ) {
jh_s[0] = dstring[6];
jh_s[1] = dstring[7];
jh_s[2] = '\0';
jahr_s[0] = dstring[8];
jahr_s[1] = dstring[9];
jahr_s[2] = '\0';
}
else if ( format == 1 ) {
jahr_s[0] = dstring[6];
jahr_s[1] = dstring[7];
jahr_s[2] = '\0';
}
} /* ENDE: Deutsches Format */
else if ( format == 3 || format == 4 || format == 8 ) { /* am.Format */
tag_s[0] = dstring[3];
tag_s[1] = dstring[4];
tag_s[2] = '\0';
monat_s[0] = dstring[0];
monat_s[1] = dstring[1];
monat_s[2] = '\0';
if ( format == 4 ) {
jh_s[0] = dstring[6];
jh_s[1] = dstring[7];
jh_s[2] = '\0';
jahr_s[0] = dstring[8];
jahr_s[1] = dstring[9];
jahr_s[2] = '\0';
}
else if ( format == 3 ) {
jahr_s[0] = dstring[6];
jahr_s[1] = dstring[7];
jahr_s[2] = '\0';
}
} /* ENDE: Amerikanisches Format */
else if ( format == 5 || format == 6 ) { /* Datenbank-Format */
if ( format == 6 ) {
jh_s[0] = dstring[0];
jh_s[1] = dstring[1];
jh_s[2] = '\0';
jahr_s[0] = dstring[2];
jahr_s[1] = dstring[3];
jahr_s[2] = '\0';
tag_s[0] = dstring[6];
tag_s[1] = dstring[7];
tag_s[2] = '\0';
monat_s[0] = dstring[4];
monat_s[1] = dstring[5];
monat_s[2] = '\0';
}
else {
jahr_s[0] = dstring[0];
jahr_s[1] = dstring[1];
jahr_s[2] = '\0';
tag_s[0] = dstring[4];
tag_s[1] = dstring[5];
tag_s[2] = '\0';
monat_s[0] = dstring[2];
monat_s[1] = dstring[3];
monat_s[2] = '\0';
}
} /* ENDE: Datenbankformat */
/* ENDE:if(Formatprüfung und Kopierung) */
/* Konvertierung :
*/
jh_z = atoi(jh_s);
jahr_z = atoi(jahr_s);
monat_z = atoi(monat_s);
tag_z = atoi(tag_s);
jahreszahl = (jh_z*100) + jahr_z;
/* Tag des übergebenen Jahres ermitteln :
*/
if ( ( schaltj_jn = schalt_jahr(jahreszahl) ) )
mlaen[2] = 29;
day_of_year += tag_z;
for ( zaehler = monat_z - 1 ; zaehler > 0 ; zaehler-- )
day_of_year += mlaen[zaehler];
if ( schaltj_jn )
rest_of_year = 366 - day_of_year;
else
rest_of_year = 365 - day_of_year;
/* Rückgabeformat auf das passende Langformat einstellen :
*/
switch ( format ) {
case 1:
case 2:
case 7: format = 2;
break;
case 3:
case 4:
case 8: format = 4;
break;
case 5:
case 6: format = 6;
break;
default: format = 2;
}
/* Aktion ermitteln :
*/
if ( abstand == 0 ) {
strcpy(erg,dstring);
return(erg);
}
else if ( abstand > 0 ) { /* Addition */
/* Sonderfall : aktueller Monat :
*/
if ( abstand <= mlaen[monat_z] - tag_z ) { /* im aktuellen Monat */
strcpy(erg,mk_datestr(tag_z+(int)abstand,monat_z,jahreszahl,format));
return(erg);
}
/* Sonderfall : aktuelles Jahr :
*/
if ( abstand <= rest_of_year ) {
abstand -= (mlaen[monat_z] - tag_z);
for ( zaehler = monat_z+1 ; abstand > mlaen[zaehler] ; zaehler++)
abstand -= mlaen[zaehler];
if ( zaehler == 13 ) {
zaehler = 1;
}
strcpy(erg,mk_datestr((int)abstand,zaehler,jahreszahl,format));
return(erg);
}
while ( abstand > 0 ) {
abstand -= rest_of_year;
jahreszahl++;
if ( schalt_jahr(jahreszahl) ) {
rest_of_year = 366;
mlaen[2] = 29;
}
else {
rest_of_year = 365;
mlaen[2] = 28;
}
if ( abstand <= rest_of_year ) {
for ( zaehler = 1 ; abstand > mlaen[zaehler] ; zaehler++ )
abstand -= mlaen[zaehler];
if ( zaehler == 13 )
zaehler = 1;